package br.com.cfccultura.admin.control.actions.aluno;

import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Component;

import br.com.cfccultura.admin.control.actions.DefaultAction;
import br.com.cfccultura.admin.control.forms.aluno.ConsultarAlunoForm;
import br.com.cfccultura.admin.model.vo.Aluno;
import br.com.cfccultura.admin.model.vo.ContaReceber;
import br.com.cfccultura.admin.model.vo.Matricula;
import br.com.cfccultura.admin.model.vo.OrdemServico;
import br.com.cfccultura.admin.view.report.ReportManager.Type;

@Component("/consultarAluno")
public class ConsultarAction extends DefaultAction {
	
	private static final Logger logger = Logger.getLogger(ConsultarAction.class);
	
	public ActionForward iniciar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		ConsultarAlunoForm alunoForm = (ConsultarAlunoForm) form;
		
		Aluno vo = getAlunoDAO().consultar(alunoForm.getAluno());
		request.setAttribute("aluno", vo);
		
		return mapping.findForward("body");
	}
	
	public ActionForward verificaAlunoCadastrado(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		ConsultarAlunoForm alunoForm = (ConsultarAlunoForm) form;
		
		Object params[] = {true, ""};
		
		if(!alunoForm.getCpf().equals("")) {
			Aluno vo = getAlunoDAO().consultar(alunoForm.getCpf());
			if(vo == null) {
				params[0] = false;
				params[1] = "CPF não encontrado!";
			} else {
				params[1] = vo.getCodigo();
			}
		} else if(alunoForm.getMatricula() > 0) {
			try {
				Matricula vo = getTurmaDAO().consultarMatricula(new Matricula(alunoForm.getMatricula()));
				params[1] = vo.getAluno().getCodigo();
			} catch(EmptyResultDataAccessException exc) {
				params[0] = false;
				params[1] = "Matrícula não encontrada!";	
			}
		}
		
		printJsonObjectToStream(params, response);
		
		return null;
	}
	
	public ActionForward verificaCpf(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {	
		
		ConsultarAlunoForm alunoForm = (ConsultarAlunoForm) form;
		Aluno vo = getAlunoDAO().consultar(alunoForm.getCpf());
		
		Object[] params = {false, ""};
		if(vo != null) {
			params = new Object[] {
				true,
				vo.getNome(),
				getDateFormatDojo().format(vo.getDataNascimento()),
				vo.getSexo().name(),
				vo.getDeficienteFisico().name(),
				
				vo.getPgu(),
				vo.getCategoriaCnh(),
				vo.getDataPrimeiraHabilitacao() != null ? getDateFormatDojo().format(vo.getDataPrimeiraHabilitacao()) : "",
				
				vo.getCep(),
				vo.getEndereco(),
				vo.getNumero(),
				vo.getComplemento(),
				vo.getBairro(),
				vo.getCidade(),
				vo.getUf().name(),
				
				vo.getTelefoneResidencia(),
				vo.getTelefoneCelular(),
				vo.getTelefoneComercial(),
				vo.getEmail(),
				vo.getRg(),
				vo.getOrgaoExpeditor(),
				vo.getCodigo()
			};
			request.getSession().setAttribute("aluno", vo.getCodigo());
		}
		
		printJsonObjectToStream(params, response);		
		
		return null;
	}
	
	public ActionForward carregarHistorico(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		ConsultarAlunoForm alunoForm = (ConsultarAlunoForm) form;
		
		List<Matricula> cursos = getAlunoDAO().consultaHistoricoCursoRealizado(new Aluno(alunoForm.getAluno()));
		if(cursos.size() > 0) {
			request.setAttribute("cursos", cursos);
		}
		
		return mapping.findForward("historico");
	}
	
	public ActionForward comprovante(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		ConsultarAlunoForm alunoForm = (ConsultarAlunoForm) form;
		
		Matricula matricula = getTurmaDAO().consultarMatricula(new Matricula(alunoForm.getMatricula()));
		
		List<ContaReceber> debitos = getFluxoCaixaDAO().verificaDebito(matricula.getOrdemServico());
		
		OrdemServico os = getOrdemServicoDAO().consultar(debitos.get(0).getOrdemServicoEspecie().getOrdemServico().getCodigo());
		matricula.setOrdemServico(os);
		
		double totalPago = 0D;
		for(ContaReceber receber : debitos) {
			totalPago += receber.getValorPagamento();
		}
		
		HashMap<String, Object> params = new HashMap<String, Object>();
		params.put("aluno", matricula.getAluno());
		params.put("matricula", matricula);
		params.put("valorPago", totalPago);
		params.put("saldo", os.getTotal() - totalPago);
		
		request.getSession().setAttribute("reportType", Type.COMPROVANTE_MATRICULA);
		request.getSession().setAttribute("jasperParams", params);
		request.getSession().setAttribute("jasperDs", os.getItems());
		
		return mapping.findForward("printReport");
	}	

}
